package cn.centec.core.entity;

import cn.centec.core.util.JsonUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;

import java.util.List;

/**
 * 标准 - 接收参数的根类
 *
 * 调用：采购中心 > 采购系统
 *
 * @author 延晓磊
 * @since 2022年12月30日
 */
@Data
public class StandardReceiveParam {

    // 原始参数（包含标准参数+扩展参数）
    private String originalParam;

    // 原始参数的JSON对象
    @JSONField(serialize=false,deserialize=false)
    private JSONObject originalParamJson;

    /**
     * 构建参数
     *
     * @param param
     * @param paramClass
     * @return 标准参数对象，绑定原始参数
     */
    public static <T extends StandardReceiveParam>T build(String param, Class<T> paramClass){
        T o = JsonUtil.parse(param, paramClass);
        o.setOriginalParam(param);
        return o;
    }

    /**
     * 获取原始参数的JSON
     *
     * @return
     */
    public JSONObject getOriginalParamJson(){
        if (this.originalParamJson == null) {
            this.originalParamJson = JsonUtil.parseObject(this.originalParam);
        }
        return this.originalParamJson;
    }

    /**
     * 获取原始参数
     *
     * @param clazz 自定义扩展类
     * @return 通过原始参数转换扩展参数（因为无法变更父类的属性，所以无法接收对象/集合属性的扩展参数）
     */
    public <T>T getOriginalParam(Class<T> clazz){
        return this.getOriginalParamJson().toJavaObject(clazz);
    }

    /**
     * 获取原始参数 - 对象类型的属性
     *
     * @param attr  属性名
     * @param clazz 属性类型
     * @return 通过原始参数转换对象型属性
     */
    public <T>T getOriginalParamAttr(String attr, Class<T> clazz){
        return this.getOriginalParamJson().getObject(attr, clazz);
    }

    /**
     * 获取原始参数 - 集合类型的属性
     *
     * @param attr  属性名
     * @param clazz 元素类型
     * @return 通过原始参数转换集合型属性
     */
    public <T> List<T> getOriginalParamAttrs(String attr, Class<T> clazz){
        return this.getOriginalParamJson().getJSONArray(attr).toJavaList(clazz);
    }

}
